package main

import "fmt"

func main() {
	p := Person{
		name: "Tom",
		age:  18,
	}
	p.PrintInfo1()
	p.PrintInfo2()

	//方法名的地址 与方法 本身地址不一样
	fmt.Println("方法地址：",p.PrintInfo1)
	fmt.Printf("方法地址：%p\n",p.PrintInfo1)

	//查看方法类型
	fmt.Printf("方法类型：%T\n",p.PrintInfo1)

	//方法值:pfunc1，自动推导实现
	pfunc1 :=p.PrintInfo1
	pfunc1()
	fmt.Printf("方法值：%T\n",pfunc1)

	//方法值：pfunc2，变量赋值实现
	//方法值调用时，是隐式传递，
	//	- 隐藏了方法接收者(实例对象)
	var pfunc2 func()
	pfunc2 = p.PrintInfo2
	pfunc2()
	fmt.Printf("方法值：%T\n",pfunc2)

	//方法表达式	显示传参
	fmt.Println("方法表达式，显示参传")
	pfunc11 := Person.PrintInfo1
	pfunc11(p)	//显示传参
	pfunc22 := (*Person).PrintInfo2
	pfunc22(&p)
}

type Person struct {
	name	string
	age		int
}

func(p Person) PrintInfo1(){
	fmt.Printf("地址：%p,对象：%v\n",&p,p)
}
func(p *Person) PrintInfo2(){
	fmt.Printf("地址：%p,对象：%v\n",p,*p)
}
